package com.gts.sofa.anotation;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;

/**
 *
 *  一、自定义注解
 *  1、使用@interface 来标识
 *  2、内部成员变量通常使用value来表示
 *  3、可以指定成员变量的默认值 使用 default 来定义
 *  4、如果自定义的注解没有 成员变量 表示一个标识的作用
 *
 *  5、如果注解有成员 在使用自定义的注解时需要给成员赋值，如果有了默认值就可以不用了
 *     但是不想用默认值可以自己重新的赋值
 *     @MyAnotation("hi")
 *
 * 二、元注解（对现有注解进行修饰的注解，jdk自带的）有4个
 *   1） @Target(ElementType.METHOD) 用来说明当前自定义的注解能修饰那些元素，类？ 属性？ 还是方法等
 *       TYPE 类、接口、枚举类
 *       LOCAL_VARIABLE 局部变量
 *
 *   2)  @Retention(RetentionPolicy.SOURCE)  指定 注解的生命周期
 *     SOURCE 是编译阶段存在 编译好了就没有 注解了
 *     CLASS  在.class 文件里面存在，但是不会加载到内存里面，默认值
 *     RUNTIME 会加载到内存里可以通过反射的方式获取到，进而判断注解是干啥的
 *
 *   3) @Documented 表示所修饰的注解在被javadoc 解析时会保留
 *
 *   4）@Inherited 他修饰的注解类将具有继承性，如果某个类使用我们自定义的注解那么这个类的子类也具有该注解
 *
 *  三、通过反射来获取注解信息
 *
 *        Class clazz = Student.class;
 *        Annotation[] annotations = clazz.getAnnotations();
 *
 *        for (int i = 0; i < annotations.length; i++) {
 *          System.out.println(annotations[i]);
 *        }
 *
 *  四、jdk 8 新特性中的注解
 *
 *     1）可重复注解
 *
 *
 *  五、自定义注解的使用场景
 *
 *     实现自定义注解+拦截器，自定义注解+AOP
 *
 *  六、类型注解
 *
 *     注解修饰范型、异常、基本变量
 *
 *
 */
@Repeatable(MyAnotations.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE,METHOD,FIELD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnotation {

    String value() default "hello"; //注意这里是成员属性,并提供默认的值
}
